/*
		Porogramm: Statistikausgabe
		06.05.2011 Polanin
*/


#include <stdio.h>
#include <stdlib.h>
#include "header.h"
#include <math.h>


		//Variablen
	char cSpiele[4][25]; // Spiele

	int iAuswahl;
		
	//Funktionen
	double GetErwartungsWert(void);
	double   BerechneNeueBewertung(char cPlayer[], char cSpiel[], double dErgebnis);
	double   GetGesamtBewertung(char cPlayer);
	   
	void SpieleArrayInit(void);

	void ShowHead(void);
	void ShowAuswahl(void);
	void ShowStatsAll(char cPlayer[]);
	void ShowStatsPlayer(void);
	void ShowStatsProSpiel(void);
		
/*Funktion SpieleArrayInit()
Initialisierung des Spielarrays
In: -
Out: -
*/
void SpieleArrayInit(void)
{
		strcpy(cSpiele[0], "checkers");
		strcpy(cSpiele[1], "reversi");
		strcpy(cSpiele[2], "vier_gewinnt");
		strcpy(cSpiele[3], "vier_gewinnt");
}

/*      Funktion ShowHead()
		Zeigt den Kopfzeile der Statistik
		In: -
		Out: -
*/
void ShowHead(void)
{
		system("cls");
		printf("\n\n\n");
		printf("\t=================================\n");
		printf("\t\tS T A T I S T I K\n");
		printf("\t=================================\n\n");
}

/*      Funktion ShowAuswahl()
		Zeigt die Auswahl nach dm Typ der zu zeigende Information
		In: -
		Out: -
*/
void ShowAuswahl(void)
{
	int iAuswahl;
	SpieleArrayInit();
	do
	{
		ShowHead();
		printf("\t1. Meine Bewertung.\n");
		printf("\t2. Allgemeine Statistik.\n");
		printf("\t3. Beenden.\n");

		printf("\n\tIhre Auswahl: ");
		scanf("%i", &iAuswahl);
			   
		switch (iAuswahl)
		{
			case 1: ShowStatsPlayer();
			break;

			case 2:
				fflush(stdin);
				ShowHead();    
				printf("\tBewertung fuer alle Spieler\n");
				printf("\t===========================\n");
				printf("\nReversi:\n");
				get_highscore("reversi");
				printf("\nBridges:\n");
				get_highscore("bridges");
				printf("\nCheckers:\n");
				get_highscore("checkers");
				printf("\nVier gewinnt:\n");
				get_highscore("vier_gewinnt");
				system("pause");
			break;
		}

	} while (iAuswahl != 3);

}

/*      Funktion ShowStatsPlayer(void)
		Zeigt die Information über die gespielte Spiele und Bewertung für den ersten Spieler
		In: -
		Out: -
*/
void ShowStatsPlayer(void)
{
	int ispiele;
	int isiege;
	int iniederlagen;
	int iremis;
	float felo;
	iSpiele = get_anzahl_spiele(acBenutzernameEins);
	iSiege = get_anzahl_siege(acBenutzernameEins);
	iNiederlagen = get_anzahl_verloren(acBenutzernameEins);
	iRemis = get_anzahl_unentschieden(acBenutzernameEins);
	fElo = get_anzahl_elo(acBenutzernameEins);
			  
	fflush(stdin);

	ShowHead();
	printf("\tSpieler: %s\n", acBenutzernameEins);
	printf("\tMeine Bewertung ueber alle Spiele: %.2f\n", fElo);
	printf("\tGespielt gesamt: %i\n", iSpiele);
	printf("\tDavon:\n");
	printf("\tSiege:\t\t %i\n", iSiege);
	printf("\tNiederlagen:\t %i\n", iNiederlagen);
	printf("\tRemis:\t\t %i\n", iRemis);
	ShowStatsProSpiel();
	printf("\n\tDruecken Sie eine beliebige Taste, um zur Auswahlmenue zu gehen.");
	getchar();
}


void ShowStatsAll(char cPlayer[])
{
	int iGewonnen;
	int iVerloren;
	int iRemis;
	int i;
	   
	printf("\tSpielername: %s\n", cPlayer);
	printf("\tBewertung: %.2f\n", GetGesamtBewertung(cPlayer));
	printf("\tGespielt:\t%i\n", get_anzahl_spiele(cPlayer));

	iGewonnen=iVerloren=iRemis=0;
	
	for (i=0; i<4; i++)
	{
		iGewonnen = iGewonnen + get_gewonnen(cPlayer, cSpiele[i]);
		iVerloren = iVerloren + get_verloren(cPlayer, cSpiele[i]);
		iRemis = iRemis + get_unentschieden(cPlayer, cSpiele[i]);
	}
	   
	printf("\tSiege:\t%i\n", iGewonnen);
	printf("\tNiederlagen: %i\n", iVerloren);
	printf("\tRemis:\t%i\n\n", iRemis);
	printf("\t-----\n");
	   
	getchar();
}


/*      Funktion ShowStatsProSpiel(void)
		Die Ausgabe der Statistik (Siege, Niederlagen, Remis) pro Spiel für den Spieler 1.
		In: kein
		Out: kein
*/
void   ShowStatsProSpiel(void)
{
	int iGewonnen_Bridges;
	int iVerloren_Bridges;
	int iUnentschieden_Bridges;
	int iGewonnen_Reversi;
	int iVerloren_Reversi;
	int iUnentschieden_Reversi;
	int iGewonnen_VierGewinnt;
	int iVerloren_VierGewinnt;
	int iUnentschieden_VierGewinnt;
	int iGewonnen_Checkers;
	int iVerloren_Checkers;
	int iUnentschieden_Checkers;

	iGewonnen_Bridges = get_gewonnen(acBenutzernameEins, "bridges");
	iVerloren_Bridges = get_verloren(acBenutzernameEins, "bridges");
	iUnentschieden_Bridges = get_unentschieden(acBenutzernameEins, "bridges");
	iGewonnen_Reversi = get_gewonnen(acBenutzernameEins, "reversi");
	iVerloren_Reversi  = get_verloren(acBenutzernameEins, "reversi");
	iUnentschieden_Reversi = get_unentschieden(acBenutzernameEins, "reversi");
	iGewonnen_VierGewinnt = get_gewonnen(acBenutzernameEins, "vier_gewinnt");
	iVerloren_VierGewinnt = get_verloren(acBenutzernameEins, "vier_gewinnt");
	iUnentschieden_VierGewinnt = get_unentschieden(acBenutzernameEins, "vier_gewinnt");
	iGewonnen_Checkers  = get_gewonnen(acBenutzernameEins, "checkers");
	iVerloren_Checkers   = get_verloren(acBenutzernameEins, "checkers");
	iUnentschieden_Checkers   = get_unentschieden(acBenutzernameEins, "checkers");

	printf("\n+==================+==================+==================+==================+\n");
	printf("|     Checkers     |     Reversi      |    4 Gewinnt     |      Bridges     |\n");
	printf("+==================+==================+==================+==================+\n");
	printf("|Siege: %10i |Siege: %10i |Siege: %10i |Siege: %10i |\n", iGewonnen_Checkers, iGewonnen_Reversi, iGewonnen_VierGewinnt, iGewonnen_Bridges);
	printf("|Niederlage: %5i |Niederlage: %5i |Niederlage: %5i |Niederlage: %5i |\n", iVerloren_Checkers, iVerloren_Reversi, iVerloren_VierGewinnt, iVerloren_Bridges);
	printf("|Remis: %10i |Remis: %10i |Remis: %10i |Remis: %10i |\n", iUnentschieden_Checkers, iUnentschieden_Reversi ,iUnentschieden_VierGewinnt, iUnentschieden_Bridges);
	printf("+==================+==================+==================+==================+\n");
}




/*      Funktion BerechneNeueBewertung(char cPlayer[], char cSpiel[], double dErgebnis)
		Berechnet die neue Bewertung.
		Die Funktion wird aus dem Spiel aufgerufen.
		In: cPlayer (Spieler), cSpiel (Spiel), dErgebnis (Ergebnis für das gespielte Spiel, Gewonnen - 1, verloren - 0, unentschieden - 0.5)
		Out: -
*/
double BerechneNeueBewertung(char cPlayer[], char cSpiel[], double dErgebnis)
{
	double dBewSelbst;
	double dBewGegner;
	dBewSelbst = get_elo(cPlayer, cSpiel);
	dBewGegner = get_elo(acBenutzernameZwei, cSpiel);
	return (dBewSelbst + 50 * (dErgebnis - GetErwartungsWert(dBewSelbst - dBewGegner)));
}

/*
	Function GetGesamtBewertung(char cPlayer)
	Gibt die Gesamtbewertung für alle Spile
	für den übergebenen Spieler (cPlayer)
	In: cPlayer - Spielername
	Out: Bewertung
*/

double   GetGesamtBewertung(char cPlayer)
{
	double dResult;
	int i;
	int iNotNull;
	double dElo;

	dResult = iNotNull = 0;
	for (i=0; i<4; i++)
	{
		dElo = get_elo(cPlayer, cSpiele[i]);
		if (dElo != 0)
		{
			dResult = dResult + dElo;
			dElo = 0;
			iNotNull++;
		}
	}

	if (iNotNull != 0)
		return dResult / iNotNull
	else
		return dResult;
}

/*
	Function GetErwartungsWert(double dBewDiff)
	Gibt das erwartende Ergebnis aufgrund der Bewertungsdiffenerz
	In: double dBewDif: Bewertungsdifferenz
	Out: erwartendes Ergebnis
*/

double GetErwartungsWert(double dBewDiff)
{
	double ;
	if (dBewDiff < 0)
		dResult = pow(0.5, (-1 *dBewDiff/201));
	else
		dResult = (1- pow(0.5, (dBewDiff/201)));

	return dResult;
}

